<?php

namespace app\addon;

/**
 * 正则表达式专用类
 *
 * @author ly-chengminbin
 *        
 */
class Regular {
	
	// 手机号
	public static $REGEX_PHONE = '/^[1-9][\d]{10}$/';
	
	// 身份证号
	public static $REGEX_ID_CARD = ' /^(\d{15}|\d{17}[0-9Xx])$/';
	
	// 验证租赁合同号 15位整数
	public static $REGEX_CONTRACT_NUM = '/^[\d]{15}';
	
	// 验证由中文或英文 组成的用户名 2-25位
	public static $REGEX_USER_NAME = '/^([a-zA-Z0-9\x{4e00}-\x{9fa5}]{1,25}|[a-zA-Z0-9\s\x{4e00}-\x{9fa5}]{1,25})$/u';
	
	//验证英文 数字 下划线组成用户名  英文或数字开头
	public static $REGEX_LOGIN_NAME = '/^[a-zA-Z0-9][a-zA-Z0-9_]{1,30}$/';
	
	// 验证由中英文数字混合组成的昵称
	public static $REGEX_NICK_NAME = '/^[a-zA-Z0-9\x{4e00}-\x{9fa5}]{1,25}$/u';

    //中英文组成字符串
    public static $REGEX_ENCN_NAME = '/^[a-zA-Z\x{4e00}-\x{9fa5}]{1,25}$/u';
    //中英文 "," "!" 组成字符串
    public static $REGEX_ENCN_STR = '/^[a-zA-Z\x{4e00}-\x{9fa5}\-_\,\!\，\！0-9\s]{1,200}$/u';
    //中英文数字"-""_"组成的字符串（值列表名称）
    public static $REGEX_DICT_STR = '/^[\s\:a-zA-Z0-9\x{4e00}-\x{9fa5}\-_\*]{1,50}$/u';

	// 验证 4位数字的 验证码
	public static $REGEX_VCODE = '/^[\d]{4}$/';
	
	// 验证 邮箱 格式
	public static $REGEX_EMAIL = '/^[a-zA-Z0-9]+([._\-][a-zA-Z0-9]+)*@([a-zA-Z0-9]+([._\-][a-zA-Z0-9]+))+$/';

	// 验证 userid
	public static $REGEX_USER_ID = '/^[-\w]{20,40}$/';
	
	//验证密码 强度 8位以上
	public static $REGEX_PASS = '/^(?![^a-zA-Z]+$)(?!\D+$)(?![\sa-zA-Z0-9]+$).{8,}$/';
	
	//菜单url  # 或 字母开头中间可以有 "/"   "_"
	public static $REGEX_MENU_URL = '/^(#|\/[a-z_A-Z\/]+#?[\?\&a-zA-Z_]*)$/';
	
	// 验证由中英文混组成的菜单名称 _ -
	public static $REGEX_MENU_NAME = '/^[0-9a-zA-Z\x{4e00}-\x{9fa5}\-_]{1,25}$/u';
	
	//验证菜单编码
	public static $MENU_CODE = '/^([a-zA-Z][a-zA-Z_\-]*[a-zA-Z]+){1,45}$/';
	//验证菜单 target id
	public static $TARGET_ID = '/^#[a-zA-Z][a-zA-Z0-9\-_]*$/';
	
	//验证角色编码  字母开头结尾 中间可带"_"
	public static $ROLE_KEY = '/^[a-zA-Z][A-Za-z_]*[a-zA-Z]$/';
    // 验证 日期 例：2016-06-03
    public static $REGEX_DATE = '/^([1-9]{1})(\d{3})-([0-3]?)(\d{1})-([0-3]?)(\d{1})$/';

    //难证 正数字
    public static $REGEX_INT = '/^[1-9]+\d*$/';
    
    //浮点数 2位小数
    public static $REGEX_FLOAT_NUM = '/^\d+\.\d{2}$/';

    //验证时间  2017-03-06 04:00:00   这种格式
    public static $REGEX_TIME = '/^\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}$/';

    // 验证客户关怀跳转URL地址  0506Add
//    public static $REGEX_LINK_URL="/^(http|https|ftp)://([A-Z0-9][A-Z0-9_-]*(?:.[A-Z0-9][A-Z0-9_-]*)+):?(d+)?/?/i";
    public static $REGEX_LINK_URL="/^(https?:\/\/)?(((www\.)?[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)?\.([a-zA-Z]+))|(([0-1]?[0-9]?[0-9]|2[0-5][0-5])\.([0-1]?[0-9]?[0-9]|2[0-5][0-5])\.([0-1]?[0-9]?[0-9]|2[0-5][0-5])\.([0-1]?[0-9]?[0-9]|2[0-5][0-5]))(\:\d{0,4})?)([\/\w-\.\/?%&=]*)?$/i";

    // 中英文数字 组成的字符串 至少1位长
    public static $REGEX_CN_EN_NUM = "/^[a-zA-Z0-9\x{4e00}-\x{9fa5}]{1,25}$/u";
    //英文与数字 组合
    public static $REGEX_EN_NUM = '/^[A-Za-z0-9]+$/';


    /**
     * @param string $uri
     * 验证URI 格式
     */
    public static function checkUri($uri = ""){
        $p = "/^[a-zA-Z\/_\-]+$/";
        if(is_string($uri) && preg_match($p,$uri)) return true;
        return false;
    }//end
    /**
     * @param string $cacheVar
     * @return bool
     * 验证缓存变量名称
     */
    public static function checkCacheVar($cacheVar = ""){
        $p = "/^[a-zA-Z0-9\,]{1,100}$/";
        if(is_string($cacheVar) && preg_match($p,$cacheVar)) return true;
        return false;
    }

    /**
     *验证正整数
     * 一般用于自增ID
     */
    public static function checkPositiveInt($int  = ""){
        $p = "/^\d+$/";
        if(is_numeric($int) && preg_match($p,$int)) return true;
        return false;
    }//end
    /**
     * @param string $carNo
     * 车牌模糊查询
     */
    public static function checkCarNo($carNo = ""){
        $p = "/^[\x{4e00}-\x{9fa5}]?[A-Z]?[a-zA-Z0-9]{1,5}$/u";
        if(is_string($carNo) && preg_match($p,$carNo)) return true;
        return false;
    }//

    /**
     * 验证文件路径
     * 英文数字 下横线_ -中横线
     * /public/images/1.png
     */
    public static function checkFilePath($file = ""){
        $p = "/^[a-zA-Z\/\.0-9\-_]+$/";
        if(is_string($file) && preg_match($p,$file)) return true;
        return false;
    }//end function

    /**
     * @param string $char
     * 验证英文与数字组合
     */
    public static function checkEnNum($char = ""){
        if(is_string($char) && preg_match(self::$REGEX_EN_NUM,$char)) return true;
        return false;
    }

    /**
     * @param string $ipdetail
     * @return bool
     * 验证 IP 端口 的组合方式
     */
    public static function checkServiceIpPort($ipdetail = ""){
        $p = "/^[\d\,\.\:]+\d+$/";
        if(is_string($ipdetail) && preg_match($p,$ipdetail)) return true;
        return false;
    }

    /**
     * @param string $uri
     * 验证URI
     */
    public static function checkUriDetail($uri = ""){
        $p = "/^\/[\/a-zA-Z0-9\_]+$/";
        if(is_string($uri) && preg_match($p,$uri)) return true;
        return false;
    }
    /**
     * @param string $uri
     * 验证后台服务的URI
     *
     */
    public static function checkServiceUri($uri = ""){
        $p = "/^(http|https)(\:)?(\/){0,2}[_0-9a-zA-Z\:\/\?\=\&\,\.\@\%\^\#\~]+[a-zA-Z0-9]$/";
        if(is_string($uri) && preg_match($p,$uri)) return true;
        return false;
    }//end function

    /**
     * @param string $str
     * 专用来过滤备注信息
     */
    public static function checkRemarkStr($str = ""){
        $p = "/^([a-zA-Z\x{4e00}-\x{9fa5}0-9\.\-_\,\!\，\！](\s[0-9a-zA-Z\x{4e00}-\x{9fa5}\.\-_\,\!\，\！]+)*){1,200}$/u";
        if(is_string($str) && preg_match($p,$str)) return true;
        return false;
    }//end function

    /**
     * @param string $type
     * 验证 车联网项目类型
     */
    public static function checkProjectType(&$type = ""){
        $p = "/^[a-zA-Z0-9][a-zA-Z0-9\-\_]*$/";
        if(is_string($type)){
            $type = trim($type);
            if(preg_match($p,$type)) return true;
        } 
        return false;
    }
    /**
     * @param string $str
     * @return bool
     * 中英文数字 , ! - _
     */
    public static function checkCnEnNumStr(&$str = ""){
        $p = "/^[\/a-zA-Z0-9\x{4e00}-\x{9fa5}\，\、\？\。\！\.\-_\,\!\(\)\s]{1,100}$/u";
        if(is_string($str)){
            $str = trim($str);
            if(preg_match($p,$str)) return true;
            return false;
        }
        return false;
    }//end function
    /**
     * @param string $str
     * @return bool
     * 姓名 实名包
     */
    public static function checkUserRealName($str = ""){
        $p = "/^[\/a-zA-Z0-9\x{4e00}-\x{9fa5}\.\·\，\。\！\.\-_\,\!\(\)]{1,100}$/u";
        if(is_string($str) && preg_match($p,$str)) return true;
        return false;
    }//end function
    /**
     * @param string $vin
     * @return bool
     * vin 码判断
     */
    public static function checkVinCode($vin = ""){
        $p = "/^[a-zA-Z0-9]{1,100}$/";
        if(is_string($vin) && preg_match($p,$vin)) return true;
        return false;
    }//end function

    /**
     * @param string $resolution
     * 区分分辨率
     *
     */
    public static function checkResolution($resolution = ""){
        $p = "/^[0-9]+x[0-9]+$/";
        if(is_string($resolution) && preg_match($p,$resolution)) return true;
        return false;
    }//end function
    /**
     * @param string $version
     * 检测版本号合法性
     * 英文数字 . _ -
     */
    public static function checkAppVersion($version = ""){
        $p = "/^[A-Za-z0-9\-\_\.]+$/";
        if(is_string($version) && preg_match($p,$version)) return true;
        return false;
    }//end func

    /**
     * @param string $version
     * 检测TCU版本号合法性
     */
    public static function checkTCUVersion($version = ""){
        $p = "/^[A-Za-z0-9\.\_]+$/";
        if(is_string($version) && preg_match($p,$version)) return true;
        return false;
    }//end func

    /**
     * @param string $str
     * @return bool
     * 验证英文 数字组成的字符串
     */
    public static function checkEnNumStr(&$str = ""){
        $p = "/^[a-zA-Z0-9][\-_a-zA-Z0-9]*$/";
        if(is_string($str)){
            $str = trim($str);
            if(preg_match($p,$str)) return true;
        } 
        return false;
    }
    /**
     * @param string $str
     * 验证后台服务名称
     * 英文 数字 . _ 这几种组成
     */
    public static function checkApiStr($str = ""){
        $p = "/^[a-zA-Z0-9\.\_]{5,100}/";
        if(is_string($str) && preg_match($p,$str)) return true;
        return false;
    }//end

    /**
     * @param string $str
     * @return bool
     * 验证中英文组成的字符串
     */
    public static function checkCnEnStr($str = ""){
        if(is_string($str) && preg_match(self::$REGEX_ENCN_STR,$str)) return true;
        return false;
    }

    /**
     * @param string $system
     * @return bool
     * 验证车联网子系统合法性
     */
    public static function checkSubSystem($system  = ""){
        $p = "/^[a-zA-Z\_\-]+$/";
        if(is_string($system) && preg_match($p,$system)) return true;
        return false;
    }//end


    /**
     * @param string $time
     * @return bool
     * 验证时间
     */
    public static function checkTime($time = ""){
        if(!is_string($time) || !preg_match(self::$REGEX_TIME,$time)) return false;
        return true;
    }
    
    /**
     * @param string $num
     * @return bool
     * 验证浮点数  正的
     */
    public static function checkFloatNum($num = ""){
        if(!is_numeric($num) || !preg_match(self::$REGEX_FLOAT_NUM,$num)) return false;
        return true;
    }
    
    public static function checkInt($num = ""){
        if(!is_numeric($num) || !preg_match(self::$REGEX_INT,$num)) return false;
        return true;
    }
	/**
	 * 验证角色编码
	 * @param string $rolekey
	 * @return boolean
	 */
	public static function checkRoleKey($rolekey = ''){
	    if(is_string($rolekey) &&preg_match(self::$ROLE_KEY, $rolekey)) return true;
	    return false;
	}
	/**
	 * 验证菜单 TARGET ID
	 * #fadsfs  这样的形式
	 * @param string $targetid
	 * @return boolean
	 */
	public static function checkMenuTargetid($targetid = ''){
	    if(is_string($targetid) && preg_match(self::$TARGET_ID,$targetid)) return true;
	    return false;
	}
	/**
	 * 验证菜单编码
	 * 字母_-  组成，必须以字母开头
	 * @param string $menucode
	 */
	public static function checkMenuCode($menucode = ''){
	    if(is_string($menucode) && preg_match(self::$MENU_CODE, $menucode)) return true;
	    return false;
	}
	/**
	 * 验证菜单名称
	 * @param string $menuname
	 * @return boolean
	 */
	public static function checkMenuName($menuname = ''){
	    if(is_string($menuname) && preg_match(self::$REGEX_MENU_NAME, $menuname)) return true;
	    return false;
	}
	/**
	 * 验证菜单编码
	 */
	public static function checkMenuurl($menuurl = ''){
	    if(is_string($menuurl) && preg_match(self::$REGEX_MENU_URL,$menuurl)) return true;
	    return false;
	}
	/**
	 * 验证用户登录名
	 */
	public static function checkLoginName($name = ''){
	    $pattern = self::$REGEX_LOGIN_NAME;
	    if(is_string($name) && preg_match($pattern,$name)) return true;
	    return false;
	}
	/**
	 * 验证密码强度
	 * @param string $pass
	 * @return boolean
	 */
    public static function checkPass($pass = ''){
        $pattern = self::$REGEX_PASS;
        if(!is_string($pass) || !preg_match($pattern, $pass))return false;
        return true;
    }
	/**
	 * 验证用户USERID是否正确
	 *
	 * @param string $userid
	 * @return boolean
	 */
	static public function checkUserId($userid = '') {
	    $pattern = self::$REGEX_USER_ID;
	    if ( !is_string($userid) || ! preg_match ( $pattern, $userid )) {
	        return false;
	    }
	    return true;
	}	
	/**
	 * 验证用户名是否正确
	 *
	 * @param string $user_name        	
	 * @return boolean
	 */
	static public function checkUserName($user_name = '') {
		$pattern = self::$REGEX_USER_NAME;
		if ( !is_string($user_name) || ! preg_match ( $pattern, $user_name )) {
			return false;
		}
		return true;
	}
	/*验证车牌号*/
    static public function checkCarNumber($car_number = '') {
        $pattern = "/^[\u4e00-\u9fa5]{1}[A-Z]{1}[A-Z0-9]{5}$/";
        if ( !is_string($car_number) || ! preg_match ( $pattern, $car_number )) {
            return false;
        }
        return true;
    }
	/**
	 * 验证用户昵称是否正确
	 *
	 * @param string $user_name
	 * @return boolean
	 */
	static public function checkNickName($nick_name = '') {
	    $pattern = self::$REGEX_NICK_NAME;
	    if ( !is_string($nick_name) || ! preg_match ( $pattern, $nick_name )) {
	        return false;
	    }
	    return true;
	}	
	
	/**
	 * 验证手机号是否正确
	 *
	 * @param string $phone_no        	
	 * @return boolean
	 */
	static public function checkPhone($phone_no = '') {
		$pattern = self::$REGEX_PHONE;
		if (!is_numeric($phone_no) || ! preg_match ( $pattern, $phone_no )) {
			return false;
		}
		return true;
	}
	
	/**
	 * 验证用户身份号是否正确
	 *
	 * @param string $id_card        	
	 * @return boolean
	 */
	static public function checkUserIdCard($id_card = '') {
		$pattern = self::$REGEX_ID_CARD;
		if (!is_string($id_card) ||  ! preg_match ( $pattern, $id_card )) {
			return false;
		}
		return true;
	}
	
	/**
	 * 验证验证码是否正确
	 *
	 * @param string $vcode        	
	 * @return boolean
	 */
	static public function checkVerifyCode($vcode = '') {
		$pattern = self::$REGEX_VCODE;
		if (! preg_match ( $pattern, $vcode )) {
			return false;
		}
		return true;
	}
	
	/**
	 * 验证EMAIL 是否正确
	 * 
	 * @param string $email        	
	 * @return boolean
	 */
	static public function checkEmail($email = '') {
		$pattern = self::$REGEX_EMAIL;
		if (!is_string($email) || ! preg_match ( $pattern, $email )) {
			return false;
		}
		return true;
	}

    /**
     * 验证日期格式（2016-06-03）是否正确
     *
     * @param string $date 验证的日期字符串
     * @return boolean
     */
    static public function checkDate($date = ''){
        $pattern = self::$REGEX_DATE;
        if( !is_string($date) || !preg_match($pattern, $date)){
            return false;
        }
        return true;
    }
    //0506Add
    static public function checkLinkUrl($link_url=''){
        $pattern = self::$REGEX_LINK_URL;
        if( !is_string($link_url) || !preg_match($pattern, $link_url)){
            return false;
        }
        return true;
    }


    /**
     * @param string $phone
     * 验证多个手机号组 用, 分开
     */
    static public function checkManyPhone($phone = ""){
        $p = "/^(\d{11}(\,)?)+$/";
        if(is_string($phone) && preg_match($p,$phone)) return true;
        return false;
    }//end

    /**
     * 验证多个 数字 , 分开
     */
    static public function checkManyNumber($num = ""){
        $p = "/^(\d+(\,)?)+$/";
        if(is_string($num) && preg_match($p,$num)) return true;
        return false;
    }//end function

    static public function checkYearMonth($str = ""){
        $p = "/^\d{4}\-\d{2}$/";
        if(is_string($str) && preg_match($p,$str)) return true;
        return false;
    }

    //验证值列表的 VALUECODE
    static public function checkLookupValueCode($valueCode = ""){
        $p = "/^[0-9a-zA-Z\_\-]+$/";
        if(is_string($valueCode) && preg_match($p,$valueCode)) return true;
        return false;     
    }//end function

}